先日はbrainfuckを触ってみましたが次は純粋関数型言語のLazy Kに挑戦してみます。今回はインタプリタとインタラクティブシェルのインストール(?)について書きます。次の記事に回します。
LazyKについていろいろgoogleで調べたのですがやっぱり関数型だからなのかやさしい日本語情報がとても少ない気がしました。英語読めばいい話ですがやはり日本語の方が楽です.
Lazy Kとは?
組み込み関数が I K S の3つしかない純粋関数型言語らしいです。Haskellなどの仲間で、C言語やbrainfuckなどの手続き型(命令型?)とは何か雰囲気が違う気がします。
概要はWikiで。
詳細はThe Lazy K Programing Language(英語)で。ここで日本語訳がされています。
開発環境
・MacOSX Yosemite
・gcc 4.9
今回の話はLinuxでも同じようにできると思います。
インタプリタ
自分で書いてみても面白そうですが始めなのでできたものを使わせてもらいます。以下の内容は主に、
みゆっきのにっき Lazy Kでhello World書いた
を参考にしました。知り合いのサイトなのでなんか悔しいですがしますが自分にとっては一番わかりやすかった気がします。彼に遅れること1年での挑戦です。
先ほどの The Lazy K Programing Language を読んでいくと The interpreter の項目でlazyというインタープリタがでてきます。最初こいつのソースがどこにあるかわからなかったのですが、みゆっきのにっきで参照されていた
Math – 言語はどこまで小さくなれるか – (unlambda|iota|jot) のすすめ
というサイトにリンクがありました。
Index of /essie2/download/lazy-kです。
ここのlazy.cppをダウンロードしてきてコンパイルします。上のサイトにある通り gcc(g++) でコンパイルしようとすると io.h がないとか言われてコンパイルできませんでした。パッチを当ててねって書いてあってそのデータも載っているのですが、windowsの実行ファイル形式のパッチしか当てたことがなかったので少し戸惑いました。(Unix系での)やり方はパッチのデータを適当な名前でlazy.cppと同じフォルダに保存して
patch < パッチのファイル名
とするとlazy.cppがパッチファイルに書かれたように修正されました。多分lazy.cppの名前を別の何かに変えていたり、内容をいじってしまっていたらうまくパッチを当てられないのでlazy.cppはオリジナルのままにしておかないといけないと思います。
しかし、パッチを当ててコンパイルしてみても以下のようなエラーが出てきました。
lazy.cpp: In function 'int main(int, char**)':
lazy.cpp:562:58: error: taking address of temporary [-fpermissive]
e = append_program(e, &File(stdin, "(standard input)"));
^
lazy.cpp:575:48: error: taking address of temporary [-fpermissive]
e = append_program(e, &StringStream(argv[i]));
^
lazy.cpp:586:42: error: taking address of temporary [-fpermissive]
e = append_program(e, &File(f, argv[i]));
なんか -fpermissive つけたくなる感じです。みゆっきのにっきにもさらりと書いてありましたが実際、
g++ -fpermissive -o lazy lazy.cpp
とするとさっきの error が warning にかわって(見た目ほとんど変わらないので気付きにくいですが)コンパイルできました。(-fpermissive オプションは適合しないコードを許可するとのこと)
これで
./lazy <lazy kファイル>
とするとそのファイルが実行できます。試しにlazy.cppがあったサイトの eg/ フォルダにある ab.lazy を落としてきて実行するとABAB….と永遠に出力されます。(ctl+Cで終わる)
インタープリタ取得完了。
インタラクティブシェル
と行きたいところですがなんかだらだら書いて長くなったので次回に回します。